import React,{useCallback, useState} from 'react';
import ReactDOM from "react-dom";
import './index.css';


function Square({value, onClick}) {

  return (
    <button className="square" onClick={onClick}>
      {value}
    </button>
  );
}


function Board ({onClick, squares}){
  const renderSquare = useCallback((i) => {
    return (
      <Square
        value={squares[i]}
        onClick={() => onClick(i)}
      />
    );
  }, [squares, onClick])

    return (
      <div>

        <div className="board-row">
          {renderSquare(0)}
          {renderSquare(1)}
          {renderSquare(2)}
        </div>
        <div className="board-row">
          {renderSquare(3)}
          {renderSquare(4)}
          {renderSquare(5)}
        </div>
        <div className="board-row">
          {renderSquare(6)}
          {renderSquare(7)}
          {renderSquare(8)}
        </div>
       </div>
    );
  }

  function Game () {

  const [gameState, setGameState] = useState({
    history: [
      {
        squares: Array(9).fill(null)
      }
    ],
    stepNumber: 0,
    xIsNext: true
  })
  
  const handleClick = useCallback((i) => {
    const history = gameState.history.slice(0, gameState.stepNumber + 1);
  const current = history[history.length- 1];
  const squares = current.squares.slice();
    if (calculateWinner(squares) || squares[i]) {
      return;}

    squares[i]=gameState.xIsNext ? 'X' : 'O';
    setGameState({
      history: history.concat([{
        squares: squares
      }]),
      stepNumber: history.length,
      xIsNext: !gameState.xIsNext
    });
  }, [gameState])

  function jumpTo(step) {
    setGameState(prev => ({
      ...prev,
      stepNumber: step,
      xIsNext: (step % 2) === 0
    }));
  }

  const history = gameState.history;
  const current = history[gameState.stepNumber];
  const winner = calculateWinner(current.squares);

  const moves = history.map((step, move) => {
    const desc = move ?
      'Go to move #' + move :
      'Go to game start';
    return (
      <li key={move}>
        <button 
        onClick={() => jumpTo(move)}
        >{desc}</button>
      </li>
    );
  });

  let status;
  if (winner) {
    status = "Winner: " + winner;
  } else {
    status = "Next player: " + (gameState.xIsNext ? "X" : "O");
  }

  return (
    <div className="game">
      <div className="game-board">
        <Board
          squares={current.squares}
          onClick={(i) => handleClick(i)}
        />
      </div>
      <div className="game-info">
        <div>{status}</div>
        <ol>{moves}</ol>
      </div>
    </div>
  );
  }

  // ========================================

  ReactDOM.render(<Game />, 
  document.getElementById("root"));

  function calculateWinner(squares) {
    const lines = [
      [0, 1, 2],
      [3, 4, 5],
      [6, 7, 8],
      [0, 3, 6],
      [1, 4, 7],
      [2, 5, 8],
      [0, 4, 8],
      [2, 4, 6],
    ];
    for (let i = 0; i < lines.length; i++) {
      const [a, b, c] = lines[i];
      if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
        return squares[a];
      }
    }
    return null;
  }